#ifndef THREADCLIENTE_H
#define THREADCLIENTE_H

#include <QThread>
#include <QTcpSocket>
#include <QHostAddress>
#include <QDataStream>
#include <QByteArray>
#include <QList>
#include <QDir>
#include <QMutex>

#include "../Trabalho3_Servidor/includes/controller/Operacoes.h"
#include "MainWindow.h"

class ThreadCliente : public QObject
{
	Q_OBJECT
	public:
		explicit ThreadCliente( const QString& ip, unsigned short porta, MainWindow *window, QObject *parent = 0);
		virtual ~ThreadCliente();

	private:
		MainWindow *window;
		QByteArray array;
		QDataStream *stream;
		QHostAddress address;
		QTcpSocket *socket;
		unsigned short porta;

		QList<QPair<QString, model::ModoAbertura> > arquivosAbertos;
		QList<QPair<QString, model::ModoAbertura> > arquivosServidor;
		QList<QString> arquivosLocais;
		QString unidade, cliente, ip;

		QList<QString> getArquivosPorExtensao( const QString & );
		void waitRead( bool firstWait = true );
		void waitWrite();

	public slots:
		void init();

		void conectar();
		void cadastrar();
		void montarUnidade();
		void logar();
		void deslogar( bool emitMessage = true );
		void sair();

		void listarArquivosLocais();
		void listarArquivos();
		void dadosArquivo();
		void adicionarArquivo();
		void adicionarArquivosPorExtensao();
		void abrirArquivo();
		void abrirArquivoPorExtensao();
		void fecharArquivo();
		void renomearArquivo();
		void apagarArquivo();
		void apagarArquivoPorExtensao();

	signals:
		void exit();

		void erro( const QString );
		void sucesso( const QString );

		void showMessageStatusBar( const QString, int );
		void setValueProgressBar( const int );
		void setMaxValueProgressBar( const int );

		void setConectado( bool );
		void setUnidade( const QString );
		void setLogado( const QString );
		void setDeslogado();
		void adicionarArquivoListaServidor( const QString&, model::ModoAbertura );
		void adicionarArquivoListaServidor( const QList<QPair<QString, model::ModoAbertura> > );
		void adicionarArquivoListaLocal( const QString );
		void adicionarArquivoListaLocal( const QList<QString> );
		void adicionarArquivoListaAbertos( const QString, model::ModoAbertura  );
		void adicionarArquivoListaAbertos( const QList<QPair<QString, model::ModoAbertura> > );
		void limparLista( const int );
		void removerArquivoLista( const QString, const int );
};

#endif // THREADCLIENTE_H
